iT邦幫忙

2022 iThome 鐵人賽

DAY 22
1

透過 API 我們可以與不同的應用程式做資料傳遞、溝通,若是每個人都可以存取那麼這樣會造成風險,例如每個人都可以查詢使用者資料、刪除使用者、編輯使用者,這將會是個災難的事,所以授權驗證是在設計 API 時需要考量的,那麼我們接下來介紹的 JWT 就是其中一種方式。

JWT

JWT 的全名是 JSON Web Token,是一種基於 JSON 的開放標準(RFC 7519),它定義了一種簡潔(compact)且自包含(self-contained)的方式,用於在雙方之間安全地將訊息作為 JSON 物件傳輸。而這個訊息是經過數位簽章(Digital Signature),因此可以被驗證及信任。可以使用密碼(經過 HMAC 演算法) 或用一對公鑰/私鑰(經過 RSAECDSA 演算法) 來對 JWT 進行簽章。

JWT 的組成

  • Header:含 Token 的種類及產生簽章(signature)要使用的雜湊演算法
  • Payload:帶有欲存放的資訊(例如用戶資訊)
  • Signature:編譯後的 Header、Payload 與密鑰透過雜湊演算法所產生

其中前兩個元素 header 和 payload 是特定結構的 JSON 物件,第三個部分取決於演算法是用來作簽章還是加密。

Header

每個 JWT 都有一個 header。header內含必要欄位:
alg:對此 JWT 進行簽章和(或)解密的主要演算法。對於未加密的 JWT,此聲明必須設置為 none

{
  "alg": "none"
}

經過編碼後為:eyJhbGciOiJub25lIn0

設定 Token 種類為 JWT、產生signature要使用的雜湊演算法為 HS256。

{
  "alg": "HS256", 
  "typ": "JWT"
}

Payload

Payload 也是一個 JSON,使用者和相關的資訊都可以放置其中。通常會使用 exp 設定 Token 到期的時間

{
  "sub": "user id",
  "name": "Olivia Chen",
  "exp": 1300875455
}

注意⚠️
不要將隱私資訊存放在 Payload 當中,Payload 和 Header 被轉換成 Base64 編碼後,能夠被輕易的轉換回來,因此不應該把如用戶密碼等重要資料存取在 Payload 當中。

Signature

簽章(Signature)是將被轉換成 Base64 編碼的 Header、Payload 與自己定義的密鑰,透過在 Header 設定的雜湊演算法方式所產生的。
由於密鑰並非公開,因此伺服器端在拿到 Token 後,能透過解碼,確認資料內容正確,且未被變更,以驗證對方身份。


上一篇
[Day21]- API 系列之 RESTful API 是什麼?
下一篇
[Day23]- API系列之 Postman
系列文
ASP.NET Core 30 天旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言